/**
 * Web 端与 Electron 桌面程序通信的辅助方法集合。
 * 主要用于一键登录与授权取 Cookie 功能。
 */

export const ELECTRON_COMM_PORT = 8888
export const ELECTRON_COMM_URL = `http://127.0.0.1:${ELECTRON_COMM_PORT}`

/**
 * 登录指令参数。
 */
export interface WebLoginCommand {
  /** 要打开的网页地址 */
  url: string
  /** Cookie 字符串（格式: key1=value1; key2=value2） */
  cookies?: string
  /** 店铺唯一标识（用于多开隔离，必填） */
  shopId: string
  /** 店铺名称（用于窗口标题，可选） */
  shopName?: string
  /** 店铺图标（可选） */
  shopIcon?: string
  /** Cookie 域名配置（可选） */
  cookieDomains?: Record<string, string[]>
  /** 指令类型，默认未传即视为 login */
  action?: 'login'
}

/**
 * 授权指令参数。
 */
export interface AuthorizationCommand {
  action: 'authorize'
  /** 登录入口地址 */
  loginUrl: string
  /** 需要监听的 Cookie 域名 */
  cookieDomain: string
  /** 登录成功关键字 */
  loginKeyword: string
  /** 超时时长（秒，可选，默认 180） */
  timeoutSeconds?: number
  /** 提示框中可展示的名称（可选） */
  shopName?: string
  /** 授权窗口图标（可选） */
  shopIcon?: string
}

/**
 * 登录响应结构。
 */
export interface WebLoginResponse {
  success: boolean
  message: string
  shopId?: string
  action?: 'open' | 'focus' | 'switch'
  partition?: string
}

/**
 * 授权响应结构。
 */
export interface AuthorizationResponse {
  success: boolean
  message?: string
  errorCode?: string
  cookies?: string
  cookieDomain?: string
}

type ElectronCommand = WebLoginCommand | AuthorizationCommand

/**
 * 判断当前是否能成功连接桌面端。
 */
export async function checkElectronRunning(): Promise<boolean> {
  try {
    await fetch(ELECTRON_COMM_URL, { method: 'OPTIONS', mode: 'no-cors' })
    return true
  } catch {
    return false
  }
}

/**
 * 发送指令到 Electron 桌面端。
 */
async function sendElectronCommand<TResponse>(
  command: ElectronCommand
): Promise<TResponse> {
  try {
    const response = await fetch(ELECTRON_COMM_URL, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json'
      },
      body: JSON.stringify(command)
    })

    if (!response.ok) {
      throw new Error(`HTTP ${response.status}: ${response.statusText}`)
    }

    return (await response.json()) as TResponse
  } catch (error) {
    console.error('向桌面程序发送指令失败:', error)
    throw new Error(
      `无法连接到 Electron 桌面程序，请确认桌面端已启动。错误: ${
        error instanceof Error ? error.message : String(error)
      }`
    )
  }
}

/**
 * 发送一键登录指令。
 */
export function sendLoginCommand(
  command: WebLoginCommand
): Promise<WebLoginResponse> {
  return sendElectronCommand<WebLoginResponse>(command)
}

/**
 * 快捷方法：一键登录（无额外域名配置）。
 */
export function quickLogin(
  url: string,
  cookies: string,
  shopId: string,
  shopName?: string,
  shopIcon?: string
): Promise<WebLoginResponse> {
  return sendLoginCommand({
    url,
    cookies,
    shopId,
    shopName,
    shopIcon,
    action: 'login'
  })
}

/**
 * 快捷方法：一键登录（带自定义 Cookie 域名配置）。
 */
export function quickLoginWithDomains(
  url: string,
  cookies: string,
  shopId: string,
  shopName: string,
  shopIcon: string | undefined,
  cookieDomains: Record<string, string[]>
): Promise<WebLoginResponse> {
  return sendLoginCommand({
    url,
    cookies,
    shopId,
    shopName,
    shopIcon,
    cookieDomains,
    action: 'login'
  })
}

/**
 * 发送授权指令，等待桌面端返回 Cookie。
 */
export function sendAuthorizeCommand(
  command: AuthorizationCommand
): Promise<AuthorizationResponse> {
  return sendElectronCommand<AuthorizationResponse>(command)
}

